package cn.iocoder.yudao.module.dify.util;


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FileStructureUtil {

    /**
     * 获取指定路径下所有文件夹及其包含的文件
     *
     * @param path 根路径
     * @return Map<String, List < String>> key为文件夹名称，value为该文件夹下的文件名列表
     */
    public static Map<String, List<File>> getFolderFilesMap(String path, List<String> fileExtensions) {
        Map<String, List<File>> folderFilesMap = new HashMap<>();
        collectFolderFiles(new File(path), folderFilesMap, fileExtensions);
        return folderFilesMap;
    }

    /**
     * 递归收集文件夹及其文件
     *
     * @param folder         当前文件夹
     * @param folderFilesMap 结果Map
     */
    private static void collectFolderFiles(File folder, Map<String, List<File>> folderFilesMap, List<String> fileExtensions) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                // 收集当前文件夹下的所有文件
                List<File> fileNames = new ArrayList<>();
                for (File file : files) {
                    if (file.isFile()) {
                        // 如果没有指定文件类型或者文件类型匹配，则添加到列表中
                        if (fileExtensions == null || fileExtensions.isEmpty() ||
                                isFileExtensionMatch(file, fileExtensions)) {
                            fileNames.add(file);
                        }
                    }
                }
                // 将当前文件夹及其文件列表加入Map
                folderFilesMap.put(folder.getName(), fileNames);
                // 递归处理子文件夹
                for (File file : files) {
                    if (file.isDirectory()) {
                        collectFolderFiles(file, folderFilesMap, fileExtensions);
                    }
                }
            }
        }
    }

    /**
     * 检查文件扩展名是否匹配指定类型
     *
     * @param file           要检查的文件
     * @param fileExtensions 允许的文件扩展名列表
     * @return 如果匹配返回true，否则返回false
     */
    private static boolean isFileExtensionMatch(File file, List<String> fileExtensions) {
        String fileName = file.getName().toLowerCase();
        for (String extension : fileExtensions) {
            if (fileName.endsWith("." + extension.toLowerCase())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否doc格式文件
     *
     * @param fileName
     */
    public static boolean isDocFile(String fileName) {
        return FileNameUtil.isType(fileName, "doc");
    }

    /**
     * 查看文件同名txt类型文件
     */
    public static String pdfFileWithTheSameNameAsTxtFile(String fileName) {
        return fileName.replace(FileNameUtil.extName(fileName), "txt");
    }

    /**
     * 查看文件同名doc类型文件
     */
    public static String docFileWithTheSameNameAsDocxFile(String fileName) {
        return fileName.replace(FileNameUtil.extName(fileName), "docx");
    }

    /**
     * stringBuilder写成markdown文件
     */
    public static void writeMarkdownFile(StringBuilder stringBuilder, String outputFilePath) {
        FileUtil.writeUtf8String(stringBuilder.toString(), outputFilePath);
    }

}

